<?php
class Upload {
	var $up_file=array(); //上传的文件数组
     
    var $dir;            //附件存放物理目录      
    var $time;           //自定义文件上传时间      
    var $allow_types;    //允许上传附件类型      
    var $field;          //上传控件名称      
    var $maxsize;        //最大允许文件大小，单位为KB
	
    //构造函数      
    //$types : 允许上传的文件类型 , $maxsize : 允许大小 ,  $field : 上传控件名称 , $time : 自定义上传时间      
    function __construct($is_up_file, $file_dir='../../../n_upload/', $types='jpg|png|gif|jpeg', $maxsize = 1024, $field='attach', $time=''){
		//global $root;
		$this->up_file = $is_up_file;
        $this->allow_types = explode('|',$types);
        $this->field = $field;
        $this->dir = $file_dir;
        $this->time = $time ? $time : time();
		$this->maxsize = $maxsize * 1024;
    }      
     
    //设置并创建文件具体存放的目录      
    //$basedir  : 基目录，必须为物理路径      
    //$filedir  : 自定义子目录，可用参数{y}、{m}、{d}      
    function set_dir($basedir,$filedir = ''){
        $dir = $basedir;      
        !is_dir($dir) && @mkdir($dir,0777);

        if (!empty($filedir)) {
            $filedir = str_replace(array('{y}','{m}','{d}'),array(date('Y',$this->time),date('m',$this->time),date('d',$this->time)),strtolower($filedir));//用string_replace把{y} {m} {d}几个标签进行替换  

            $dirs = explode('/',$filedir);
			
            foreach ($dirs as $d) {
                !empty($d) && $dir .= $d.'/';
                !is_dir($dir) && @mkdir($dir,0777);
            }
        }
        return $dir;      
    }      
    
    /*—————————————————————-    
    执行文件上传，处理完返回一个包含上传成功或失败的文件信息数组，    
    其中：name 为文件名，上传成功时是上传到服务器上的文件名，上传失败则是本地的文件名    
          handle_dir  缩略图
		  original_dir  原图
          size 为附件大小，上传失败不存在该值    
          flag 为状态标识，1表示成功，-1表示文件类型不允许，-2表示文件大小超出    
    —————————————————————–*/     
    function execute(){
        $files = array(); //成功上传的文件信息      
        $field = $this->field;      
        $keys = array_keys($this->up_file[$field]['name']);      
        foreach ($keys as $key) {
            if (!$this->up_file[$field]['name'][$key]) continue;      
		
			$fileext = $this->fileext($this->up_file[$field]['name'][$key]); //获取文件扩展名 
			
			if( $fileext != 'zip' ){//图片上传	
				$filename = time().rand( 1 , 10000 ).'.'.$fileext; //生成文件名      
				$filedir_original = $this->set_dir($this->dir.'original/', '{y}{m}{d}');//创建原图目录
				$filedir_handle = $this->set_dir($this->dir.'handle/', '{y}{m}{d}');//创建处理图片目录
				$filesize = $this->up_file[$field]['size'][$key]; //文件大小      
					  
				//文件类型不允许
				if (!in_array($fileext,$this->allow_types)) {   
					$files[$key]['flag'] = -1;      
					continue;      
				}      
		 
				//文件大小超出      
				if ($filesize > $this->maxsize) {   
					$files[$key]['flag'] = -2;      
					continue;      
				}

				//保存上传文件并删除临时文件      
				if (is_uploaded_file($this->up_file[$field]['tmp_name'][$key])) {
					@copy($this->up_file[$field]['tmp_name'][$key],$filedir_handle.$filename);      
					@copy($this->up_file[$field]['tmp_name'][$key],$filedir_original.$filename);      
					@unlink($this->up_file[$field]['tmp_name'][$key]);      
					$files[$key]['flag'] = 1;     
				}
				
				$files[$key]['name'] = $filename;
				$files[$key]['handle_dir'] = substr($filedir_handle,8);
				$files[$key]['size'] = $filesize;
			}else{//附件上传
				$filename = date('Y-m-d-H-i-s',$this->time).'.'.$fileext; //生成文件名
				$filedir_handle = $this->set_dir($this->dir);//创建目录
				$filesize = $this->up_file[$field]['size'][$key]; //文件大小      
				
				//文件类型不允许      
				if (!in_array($fileext,$this->allow_types)) {    
					$files[$key]['flag'] = -1;      
					continue;
				}
		 
				//文件大小超出      
				if ($filesize > $this->maxsize) {
					$files[$key]['flag'] = -2;      
					continue;      
				}
				
				//保存上传文件并删除临时文件      
				if (is_uploaded_file($this->up_file[$field]['tmp_name'][$key])) {
					copy($this->up_file[$field]['tmp_name'][$key],$filedir_handle.$filename);      
					@unlink($this->up_file[$field]['tmp_name'][$key]);
					
					$files[$key]['flag'] = 1;     
				}
				
				$files[$key]['name'] = $filename;
				$files[$key]['handle_dir'] = $filedir_handle;
				$files[$key]['size'] = $filesize;
			}
        }      
     
        return $files;      
    }
     
    //获取文件扩展名      
    function fileext($filename) {      
        return strtolower(substr(strrchr($filename,'.'),1,10));      
    }      
}